/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.hogent.iii.project.client.gui.gameroom;

import be.hogent.iii.project.client.netwerk.Connectie;
import be.hogent.iii.project.client.netwerk.Connectie;
import be.hogent.iii.project.common.bericht.GameStartBericht;
import be.hogent.iii.project.common.bericht.StatistiekWedstrijdResultaatBericht;
import be.hogent.iii.project.common.bericht.StatistiekenWedstrijdenBericht;
import be.hogent.iii.project.common.bericht.chat.ChatBericht;
import be.hogent.iii.project.common.game.objecten.Resultaat;
import be.hogent.iii.project.common.game.objecten.Spel;
import be.hogent.iii.project.common.game.objecten.Speler;
import be.hogent.iii.project.common.game.objecten.Wedstrijd;
import com.thoughtworks.xstream.XStream;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.regex.Pattern;
import javax.swing.JPanel;

/**
 *
 * @author jef donders
 */
public class GameRoomGui extends JPanel {

    private JPanel infoPanel;
    private InfoPlayerPanel infoPlayerPanel;
    private InfoGamePanel infoGamePanel;
    private TabbedPanePanel tabbedPanePanel;
    private ChatPanel chatPanel;
    private Connectie connectie;
    private Speler speler;
    private boolean startscherm = true;

    public GameRoomGui(Connectie conn, Speler speler, Dimension size) {
        connectie = conn;
        this.speler = speler;
        initialiseerPaneel(size);
        setBackground(new java.awt.Color(0, 0, 0));
        setForeground(new java.awt.Color(255, 255, 255));
    }

    public void initialiseerPaneel(Dimension size) {

        Dimension tabbedPaneGrootte = new Dimension(size.width / 4 - 30, size.height - 5);
        Dimension chatPaneGrootte = new Dimension(3 * size.width / 4 - 10, size.height / 3 - 5);
        Dimension infoPaneGrootte = new Dimension(3 * size.width / 4 - 10, 2 * size.height / 3 - 17);

        infoPanel = new JPanel();
        infoPanel.setBackground(new java.awt.Color(0, 0, 0));
        infoPanel.setForeground(new java.awt.Color(255, 255, 255));
        infoPanel.add(new LeegInfoPanel());
        
        infoPlayerPanel = new InfoPlayerPanel(this, infoPaneGrootte);
        infoGamePanel = new InfoGamePanel();
        infoGamePanel.setSize(infoPaneGrootte);
        //infoPanel.add(infoPlayerPanel);

        tabbedPanePanel = new TabbedPanePanel(this, tabbedPaneGrootte);
        chatPanel = new ChatPanel(this);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);

        layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(infoPanel, infoPaneGrootte.width, infoPaneGrootte.width, infoPaneGrootte.width).addComponent(chatPanel, chatPaneGrootte.width, chatPaneGrootte.width, chatPaneGrootte.width)).addGap(20, 20, 20).addComponent(tabbedPanePanel, tabbedPaneGrootte.width, tabbedPaneGrootte.width, tabbedPaneGrootte.width).addGap(20, 20, 20)));
        layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addComponent(infoPanel, infoPaneGrootte.height, infoPaneGrootte.height, infoPaneGrootte.height) //.addGap(5, 5, 5)
                .addComponent(chatPanel, chatPaneGrootte.height, chatPaneGrootte.height, chatPaneGrootte.height)).addComponent(tabbedPanePanel, tabbedPaneGrootte.height, tabbedPaneGrootte.height, tabbedPaneGrootte.height));

    }

    /**
     * vraagt de statistieken van een bepaalde speler op,
     * deze zullen door de handler van het antwoordbericht getoond worden
     * @param nickname De naam van de speler
     */
    public void setInhoudInfoPanelSpeler(String nickname) {
        startscherm = false;
        StatistiekenWedstrijdenBericht bericht = new StatistiekenWedstrijdenBericht(nickname);
        XStream xStream = new XStream();
        connectie.stuurBericht(xStream.toXML(bericht));
    }

    /**
     * Toont de informatie van het nde spel
     * @param n nummer van het spel
     */
    public void setInhoudInfoPanelGame(int n) {
        startscherm = false;
        infoGamePanel.setSpel(tabbedPanePanel.getSpel(n));
    }

    /**
     * zorgt ervoor dat de spelerinfo en zijn wedstrijden getoond worden
     * @param speler de spelers
     * @param wedstrijden de gespeelde wedstrijden van de spelers
     */
    public void setInhoudInfoSpelerPanel(Speler speler, ArrayList<Wedstrijd> wedstrijden) {
        startscherm = false;
        setInfoGamePanel("Spelers");
        infoPlayerPanel.setInhoudSpeler(speler, wedstrijden);
    }

    /**
     * vraagt het resultaat van een bepaalde wedstrijd op
     * @param battleId
     */
    public void vraagWedstrijdResultaat(int battleId) {
        StatistiekWedstrijdResultaatBericht bericht = new StatistiekWedstrijdResultaatBericht(battleId);
        XStream xStream = new XStream();
        connectie.stuurBericht(xStream.toXML(bericht));
    }

    /**
     * toont het resultaat dat teruggezonden werd
     * @param resultaat het ontvangen resultaat
     */
    public void setWedstrijdResultaat(Resultaat resultaat) {
        infoPlayerPanel.setWedstrijdDetail(resultaat);
    }

    /**
     * print chat in de console
     * @param sender de zender
     * @param message het bericht
     */
    public void printChat(String sender, String message) {
        chatPanel.printText(sender + " : " + message + "\n");
    }

    public Speler getSpeler() {
        return speler;
    }

    /**
     * stuurt een chatbericht
     * @param message het bericht
     */
    public void stuurChatBericht(String message) {
        
        //even checken dat het bericht toch zeker niet leeg is
        if (!message.equals("")) {
            //textFieldChat.setText("");
            XStream xStream = new XStream();
            ChatBericht chat;

            //is het een whisper?
            if (message.startsWith("/pm")) {
                //whitespace eraf doen aan beide kanten
                message = message.trim();
                //regex aanmaken om op te splitsen in whitespace
                Pattern p = Pattern.compile("[\\s]+");
                //de boodschap opsplitsen in "'/pm'-'nickname'-'boodschap'"
                String[] result = p.split(message, 3);
                //het chatbericht aanmaken
                chat = new ChatBericht(speler.getNick(), result[2], result[1], true);
                //onszelf laten zien naar wie we wat gewhisperd hebben
                chatPanel.printText("->" + result[1] + ": " + result[2]+"\n");
            } //zoniet, dan is het een bericht naar iedereen in de room
            else {
                chat = new ChatBericht(speler.getNick(), message, "mainChat", false);
            }
            //uiteindelijk versturen we ons bericht naar de server
            connectie.stuurBericht(xStream.toXML(chat));
        }
    }

    /**
     * Veranderd het infopaneel naar de gekozen tab van het tabbedPanel (games of spelers)
     * @param name naam van de gekozen tab
     */
    public void setInfoGamePanel(String name) {
        if (!startscherm){
            infoPanel.removeAll();
            infoPanel.repaint();
            
            if (name.equalsIgnoreCase("Games")) {
                infoPanel.add(infoGamePanel);
            }
            if (name.equalsIgnoreCase("Spelers")) {
                infoPanel.add(infoPlayerPanel);
            }
        }
        else startscherm = false;
    }

    public Connectie getconnectie() {
        return connectie;
    }

    public void setTabbedPaneSpelers(ArrayList<Speler> spelers) {
        tabbedPanePanel.maakLijstSpelers(spelers);
    }

    public void setTabbedPaneGames(ArrayList<Spel> spellen) {
        tabbedPanePanel.maakLijstGames(spellen);
    }

    /**
     * start het geselecteerde spel
     * @param spel het spel dat gestart moet worden
     */
    public void startGame(Spel spel) {
        GameStartBericht spelStarten = new GameStartBericht();
        spelStarten.setSpel(spel);
        XStream xStream = new XStream();
        connectie.stuurBericht(xStream.toXML(spelStarten));
    }
}
